package com.pond.pond.service;

import com.pond.pond.domain.FishingTechnique;
import com.pond.pond.domain.FishingTechniqueComment;
import com.pond.pond.domain.vo.FishingTechniqueVo;

import java.util.List;
import java.util.Map;

/**
 * 钓技文章Service接口
 * 
 * @author pond
 * @date 2024-01-15
 */
public interface IFishingTechniqueService 
{
    /**
     * 查询钓技文章
     * 
     * @param id 钓技文章主键
     * @return 钓技文章
     */
    public FishingTechnique selectFishingTechniqueById(Long id);

    /**
     * 查询钓技文章详情（包含用户交互状态）
     * 
     * @param id 钓技文章主键
     * @param userId 用户ID
     * @return 钓技文章
     */
    public FishingTechniqueVo selectFishingTechniqueDetailById(Long id, Long userId);

    /**
     * 查询钓技文章列表
     * 
     * @param fishingTechnique 钓技文章
     * @return 钓技文章集合
     */
    public List<FishingTechnique> selectFishingTechniqueList(FishingTechnique fishingTechnique);

    /**
     * 查询钓技文章列表（包含用户交互状态）
     * 
     * @param fishingTechnique 钓技文章
     * @param userId 用户ID
     * @return 钓技文章集合
     */
    public List<FishingTechniqueVo> selectFishingTechniqueListWithUser(FishingTechnique fishingTechnique, Long userId);

    /**
     * 新增钓技文章
     * 
     * @param fishingTechnique 钓技文章
     * @return 结果
     */
    public int insertFishingTechnique(FishingTechnique fishingTechnique);

    /**
     * 修改钓技文章
     * 
     * @param fishingTechnique 钓技文章
     * @return 结果
     */
    public int updateFishingTechnique(FishingTechnique fishingTechnique);

    /**
     * 批量删除钓技文章
     * 
     * @param ids 需要删除的钓技文章主键集合
     * @return 结果
     */
    public int deleteFishingTechniqueByIds(Long[] ids);

    /**
     * 删除钓技文章信息
     * 
     * @param id 钓技文章主键
     * @return 结果
     */
    public int deleteFishingTechniqueById(Long id);

    /**
     * 增加文章阅读量
     * 
     * @param id 文章ID
     * @return 新的阅读量
     */
    public int incrementReadCount(Long id);

    /**
     * 点赞/取消点赞文章
     * 
     * @param id 文章ID
     * @param userId 用户ID
     * @return 操作结果
     */
    public Map<String, Object> toggleLike(Long id, Long userId);

    /**
     * 收藏/取消收藏文章
     * 
     * @param id 文章ID
     * @param userId 用户ID
     * @return 操作结果
     */
    public Map<String, Object> toggleFavorite(Long id, Long userId);

    /**
     * 查询用户收藏的文章列表
     * 
     * @param userId 用户ID
     * @return 文章列表
     */
    public List<FishingTechniqueVo> selectUserFavorites(Long userId);

    /**
     * 查询热门文章
     * 
     * @param limit 数量限制
     * @param type 排序类型：read-阅读量，like-点赞数，favorite-收藏数
     * @return 文章列表
     */
    public List<FishingTechniqueVo> selectHotTechniques(Integer limit, String type);

    /**
     * 查询所有分类及其文章数量
     * 
     * @return 分类统计
     */
    public List<Map<String, Object>> selectCategoryStats();

    /**
     * 查询热门标签
     * 
     * @param limit 数量限制
     * @return 标签统计
     */
    public List<Map<String, Object>> selectHotTags(Integer limit);

    /**
     * 获取文章统计信息
     * 
     * @param id 文章ID
     * @return 统计信息
     */
    public Map<String, Object> getArticleStats(Long id);

    /**
     * 发表评论
     * 
     * @param comment 评论信息
     * @return 评论ID
     */
    public Long addComment(FishingTechniqueComment comment);

    /**
     * 删除评论
     * 
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 结果
     */
    public boolean deleteComment(Long commentId, Long userId);

    /**
     * 点赞/取消点赞评论
     * 
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 操作结果
     */
    public Map<String, Object> toggleCommentLike(Long commentId, Long userId);

    /**
     * 查询文章评论列表
     * 
     * @param techniqueId 文章ID
     * @param userId 当前用户ID
     * @return 评论列表
     */
    public List<FishingTechniqueComment> selectCommentsByTechniqueId(Long techniqueId, Long userId);

    /**
     * 获取用户评论列表（包含文章标题）
     * 
     * @param userId 用户ID
     * @return 用户评论列表
     */
    public List<Map<String, Object>> selectUserCommentsWithTechniqueTitle(Long userId);
}